package chatNI;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import chatControler.ChatControler;
import chatGUI.BarreProgression;
import chatModel.*;

/**
 * Thread qui sert à envoyer in fichier
 * 
 */
public class ThreadTcpEnvoie extends Thread {
	
	private Socket socket;
	private File file;
	private ChatControler chatControler;
	private UtilisateurDistant user;
	private BarreProgression fenBarProg;
	
        /**
         * Constructeur
         * @param socket Socket utilisé pour envoyer le fichier
         * @param file Fichier à envoyer
         * @param chatControler ChatControler du ChatSystem pour l'avertir de l'état de l'envoi
         * @param user Utilisateur distant à qui est destiné ce fichier
         */
	public ThreadTcpEnvoie(Socket socket, File file, ChatControler chatControler, UtilisateurDistant user) {
		this.socket = socket;
		this.file = file;
		this.chatControler = chatControler;
		this.user=user;
		this.fenBarProg = new BarreProgression(this.file.getName());
	}
	
        /**
         * Démarre le thread
         * Ouvre une barre de progression
         * @see chatGUI.BarreProgression BarreProgression
         */
	public void run(){
		this.fenBarProg.pack();
		this.fenBarProg.setVisible(true);
		System.out.println("taille du fichier : "+this.file.length());
		sendFile(this.socket, this.file);
		this.chatControler.fichierEnvoye(user);

	}
	
        /**
         * Envoi le fichier
         * @see chatGUI.BarreProgression BarreProgression
         * @param socket Socket dans lequel va passer le fichier
         * @param file Fichier à envoyer
         */
	public void sendFile(Socket socket, File file){
		InputStream fichierDEntree=null;
		OutputStream fichierDeSortie=null;
		
		try {
			fichierDEntree = new FileInputStream(file);
			fichierDeSortie = this.socket.getOutputStream();
			
			byte[] toSend = new byte[1024];
			int passage=0;
			int value=5;
			int i;
			while (( i = fichierDEntree.read(toSend, 0, 1024)) != -1){
				fichierDeSortie.write(toSend, 0, i);
				passage++;
				if((passage*1024)>=(file.length()*value/100)){
					this.fenBarProg.progressbar.setValue(value);
					value=value+5;
				}
			}
			this.fenBarProg.progressbar.setValue(100);
			System.out.println("nombre de passage dans while : " +passage);
		} catch (IOException e) {
			System.out.println("Problème avec la socket");
			e.printStackTrace();
		}finally{
			try {
				fichierDEntree.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				fichierDeSortie.flush();
				fichierDeSortie.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				this.socket.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	

}
